#ifndef SCINTILLABASE_H
#define SCINTILLABASE_H


#include "PropSetSimple.h"


#ifdef SCI_NAMESPACE
namespace Scintilla {
#endif

  #ifdef SCI_LEXER
  class LexState;
  #endif


  class ScintillaBase : public Editor {
      // Private so ScintillaBase objects can not be copied
      ScintillaBase( const ScintillaBase & );
      ScintillaBase &operator=( const ScintillaBase & );

    protected:

      enum {
        idCallTip = 1,
        idAutoComplete = 2,

        idcmdUndo = 10,
        idcmdRedo = 11,
        idcmdCut = 12,
        idcmdCopy = 13,
        idcmdPaste = 14,
        idcmdDelete = 15,
        idcmdSelectAll = 16
      };

      enum { maxLenInputIME = 200 };

      bool displayPopupMenu;
      Menu popup;
      AutoComplete ac;

      CallTip ct;

      int listType;     ///< 0 is an autocomplete list
      int maxListWidth;   /// Maximum width of list, in average character widths
      int multiAutoCMode;
      #ifdef SCI_LEXER
      LexState *DocumentLexState();
      void SetLexer( uptr_t wParam );
      void SetLexerLanguage( const char *languageName );
      void Colourise( int start, int end );
      #endif

      ScintillaBase();
      virtual ~ScintillaBase();
      virtual void Initialise() = 0;
      virtual void Finalise();

      virtual void AddCharUTF( const char *s, unsigned int len, bool treatAsDBCS = false );
      void Command( int cmdId );
      virtual void CancelModes();
      virtual int KeyCommand( unsigned int iMessage );

      void AutoCompleteInsert( Position startPos, int removeLen, const char *text, int textLen );
      void AutoCompleteStart( int lenEntered, const char *list );
      void AutoCompleteCancel();
      void AutoCompleteMove( int delta );
      int AutoCompleteGetCurrent() const;
      int AutoCompleteGetCurrentText( char *buffer ) const;
      void AutoCompleteCharacterAdded( char ch );
      void AutoCompleteCharacterDeleted();
      void AutoCompleteCompleted();
      void AutoCompleteMoveToCurrentWord();
      static void AutoCompleteDoubleClick( void *p );

      void CallTipClick();
      void CallTipShow( Point pt, const char *defn );
      virtual void CreateCallTipWindow( PRectangle rc ) = 0;

      virtual void AddToPopUp( const char *label, int cmd = 0, bool enabled = true ) = 0;
      void ContextMenu( Point pt );

      virtual void ButtonDownWithModifiers( Point pt, unsigned int curTime, int modifiers );
      virtual void ButtonDown( Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt );

      void NotifyStyleToNeeded( int endStyleNeeded );
      void NotifyLexerChanged( Document *doc, void *userData );

    public:
      // Public so scintilla_send_message can use it
      virtual sptr_t WndProc( unsigned int iMessage, uptr_t wParam, sptr_t lParam );
  };

  #ifdef SCI_NAMESPACE
}
  #endif

#endif
